package org.dromara.common.oss.enumd;

import lombok.AllArgsConstructor;
import lombok.Getter;
import software.amazon.awssdk.services.s3.model.BucketCannedACL;
import software.amazon.awssdk.services.s3.model.ObjectCannedACL;


/**
 * @Author 刘武贵
 * @Date 2024/8/15 22:00
 * @Description 功能描述：桶访问策略配置
 */
@Getter
@AllArgsConstructor
public enum AccessPolicyType {

    /**
     * private
     * 私有权限设置
     * 该常量定义了存储桶和对象的私有访问权限，以及相应的策略类型
     * PRIVATE常量用于标识一种权限级别，其中存储桶和对象的访问权限设置为私有，且策略类型为写入
     */
    PRIVATE("0", BucketCannedACL.PRIVATE, ObjectCannedACL.PRIVATE, PolicyType.WRITE),

    /**
     * public
     * 公共权限设置
     * 该常量定义了存储桶和对象的公共读写权限，以及相应的策略类型
     * PUBLIC常量用于标识一种权限级别，其中存储桶和对象的访问权限设置为公共读写，且策略类型为读写
     */
    PUBLIC("1", BucketCannedACL.PUBLIC_READ_WRITE, ObjectCannedACL.PUBLIC_READ_WRITE, PolicyType.READ_WRITE),

    /**
     * custom
     */
    CUSTOM("2", BucketCannedACL.PUBLIC_READ, ObjectCannedACL.PUBLIC_READ, PolicyType.READ);

    /**
     * 桶 权限类型（数据库值）
     * 自定义权限设置
     * 该常量定义了存储桶和对象的公共读权限，以及相应的策略类型
     * CUSTOM常量用于标识一种权限级别，其中存储桶和对象的访问权限设置为公共读，且策略类型为读取
     */
    private final String type;

    /**
     * 桶 权限类型
     */
    private final BucketCannedACL bucketCannedACL;

    /**
     * 文件对象 权限类型
     */
    private final ObjectCannedACL objectCannedACL;

    /**
     * 桶策略类型
     */
    private final PolicyType policyType;

    /**
     * 根据类型字符串获取对应的访问策略枚举值
     *
     * 此方法遍历所有预定义的访问策略类型，比较其类型字符串，以找到匹配的枚举值如果找不到匹配项，则抛出运行时异常
     * 这种设计允许在动态确定访问策略类型时使用字符串，同时确保了类型安全
     *
     * @param type 访问策略的字符串表示，用于查找对应的枚举值
     * @return 匹配的访问策略枚举值
     * @throws RuntimeException 如果给定的类型字符串找不到匹配的枚举值，则抛出此异常
     */
    public static AccessPolicyType getByType(String type) {
        for (AccessPolicyType value : values()) {
            if (value.getType().equals(type)) {
                return value;
            }
        }
        throw new RuntimeException("'type' not found By " + type);
    }

}
